<?php
class Page 
{
 /**
  * config ,public
  */
 var $page_name	 	= "page";        /** @param page_name  标签，用来控制url页。比如说xxx.php?PB_page=2中的PB_page  */
 var $next_page		= '>';           /** @param next_page  下一页  */
 var $pre_page 		='<';            /** @param pre_page   上一页  */
 var $first_page 	='First';        /** @param first_page 首页  */
 var $last_page		='Last';         /** @param last_page  尾页  */
 var $pre_bar		='<<';           /** @param pre_bar    上一分页条  */
 var $next_bar		='>>';           /** @param next_bar   下一分页条  */
 var $format_left	='[';
 var $format_right	=']';
 

 var $pagebarnum=10;             /** @param pagebarnum        控制记录条的个数。  */
 var $total=0;					 /** @param total             记录总数  */
 var $totalpage=0;               /** @param totalpage         总页数  */
 var $nowindex;                  /** @param nowindex          当前页  */
 var $url;        			     /** @param offset            url地址头 */
 var $offset=0;
 
 function Page($total=0,$perpage=10,$pagebarnum=5,$nowindex=1,$url="",$pagename="")
 {
	  $this->total		= intval($total);  //@param total 总记录数
	  $this->perpage	= $perpage ? intval($perpage) : 10; 	//@param perpage 每页显示记录条数
	  $this->url		= $url;
	  $this->pagebarnum = $pagebarnum;
	  $this->nowindex   = $nowindex;
	  $this->page_name   = $pagename ? $pagename :$this->page_name;
	  
	  if( (!is_int($total)) || ($total<0)) 
		$this->error(__FUNCTION__,$total.' is not a positive integer!');
		
	  if((!is_int($perpage))||($perpage<=0))
		$this->error(__FUNCTION__,$perpage.' is not a positive integer!');
		
	  if(!empty($page_name))
		$this->set('page_name',$page_name);  //@param设置pagename
		
	  $this->setNowIndex($this->nowindex);  //@param设置当前页
	  $this->setUrl($url);//设置链接地址
	  $this->totalpage = ceil($total/$perpage); //@param计算总页数
	  $this->offset    = ($this->nowindex-1)*$this->perpage;  //@param每页的起始处
 }
 
 /**
  * 设定类中指定变量名的值，如果改变量不属于这个类，将throw一个exception
  *
  * @param string $var　　　变量
  * @param string $value　　变量值
  */
  
 function set($var,$value)
 {
	  if($this->$var){
		 $this->$var=$value;
	  }else {
	   $this->error(__FUNCTION__,$var." does not belong to PB_Page!");
	  }
  
 }
 
 /**
  * 获取显示"下一页"的代码
  * 
  * @param string $style  样式
  * @return string
  */
 function nextPage($style='')
 {
	  if($this->nowindex < $this->totalpage){
	   return $this->getLink($this->getUrl($this->nowindex+1),$this->next_page,$style);
	   
	  }
	  return '<span class="'.$style.'">'.$this->next_page.'</span>';
 }
 
 /**
  * 获取显示“上一页”的代码
  *
  * @param string $style  样式
  * @return string
  */
 function prePage($style='')
 {
  if($this->nowindex>1){
   return $this->getLink($this->getUrl($this->nowindex-1),$this->pre_page,$style);
  }
  return '<span class="'.$style.'">'.$this->pre_page.'</span>';
 }
 
 /**
  * 获取显示“首页”的代码
  *
　* @param string $style   样式  
  * @return string
  *
  */
 function firstPage($style='')
 {
	  if($this->nowindex==1){
		  return '<span class="'.$style.'">'.$this->first_page.'</span>';
	  }
	  return $this->getLink($this->getUrl(1),$this->first_page,$style);
 }
 
 /**
  * 获取显示“尾页”的代码
  *
　*@param string $style   样式
  * @return string
  */
 function lastPage($style='')
 {
	  if($this->nowindex==$this->totalpage){
		  return '<span class="'.$style.'">'.$this->last_page.'</span>';
	  }
	  return $this->getLink($this->getUrl($this->totalpage),$this->last_page,$style);
 }
 
 function nowbar($style='',$nowindex_style='')
 {
	  $plus=ceil($this->pagebarnum/2);
	  if($this->pagebarnum-$plus+$this->nowindex>$this->totalpage)$plus=($this->pagebarnum-$this->totalpage+$this->nowindex);
	  $begin=$this->nowindex-$plus+1;
	  $begin=($begin>=1)?$begin:1;
	  $return='';
	  for($i=$begin;$i<$begin+$this->pagebarnum;$i++)
	  {
	   if($i<=$this->totalpage){
		if($i!=$this->nowindex)
			$return.=$this->getText($this->getLink($this->getUrl($i),$i,$style));
		else 
			$return.=$this->getText('<span class="'.$nowindex_style.'">'.$i.'</span>');
	   }else{
		break;
	   }
	   $return.="\n";
	  }
	  unset($begin);
	  return $return;
 }
 /**
  * 获取显示跳转下拉列表框的代码
  *
  * @return string
  */
 function select()
 {
 	  $url = $this->setUrl();
	  $url = $this->url;
	  $indexof = strrpos($url,'&');
	  if($indexof)
	 	 $url = substr($url,0,$indexof+1).$this->page_name."=";
	  else
	  	 $url = $url;
		 
	  $return ="<select name='PB_Page_Select' onChange='location=\"$url\"+this.value'>";
	  for( $i=1;$i <= $this->totalpage; $i++)
	  {
		   if($i==$this->nowindex){
			$return.='<option value="'.$i.'" selected>'.$i.'</option>';
		   }else{
			$return.='<option value="'.$i.'">'.$i.'</option>';
		   }
  	  }
  	  unset($i);
      $return  .='</select>';
	  
 	  return $return;
	 // return $url;
 }
 
 /**
  * 获取mysql 语句中limit需要的值
  *
  * @return string
  */
 function offSet()
 {
  	return $this->offset;
 }
 
 /**
  * 控制分页显示风格（你可以增加相应的风格）
  *
  * @param int $mode
  * @return string
  */
 function show($mode=1)
 {
	  switch ($mode)
	  {
	   case '1':
			$this->next_page = '下一页';
			$this->pre_page  = '上一页';
			return $this->prePage().$this->nowbar().$this->nextPage().'　　转到'.$this->select().'页';
			break;
			
	   case '2':
			$this->next_page  = 'NEXT';
			$this->pre_page	  = 'Previous';
			$this->first_page = 'First';
			$this->last_page  = 'Last';
			return $this->firstPage()."　".$this->prePage().'　[At<FONT COLOR=RED>'.$this->nowindex.'</FONT>Page]'."　".$this->nextPage()."　".$this->lastPage().'　　TURN'.$this->select().'PAGE';
			break;
			
	   case '3':
			$this->next_page  = '下一页';
			$this->pre_page   = '上一页';
			$this->first_page = '首页';
			$this->last_page  = '尾页';
			return $this->firstPage()."　".$this->prePage()."　".$this->nextPage()."　".$this->lastPage();
			break;
			
	   case '4':
			$this->next_page = '下一页';
			$this->pre_page  = '上一页';
			return $this->prePage()."　".$this->nowbar()."　".$this->nextPage();
			break;
			
	   case '5':
			return $this->prePage()."　".$this->nowbar()."　".$this->nextPage();
			break;
			
	  }
  
 }
/*----------------private function (私有方法)-----------------------------------------------------------*/
 /**
  * 设置url头地址
  * @param: String $url（转向URL，转默认为空则设置为当前页）
  * @return boolean
  */
 function setUrl($url="")
 {
	  if($url)
	  {
		  //手动设置
	   $this->url = $url.((stristr($url,'?')) ? '&' : '?').$this->page_name."=";
	  }
	  else
	  {
		  //自动获取
		   if(empty($_SERVER['QUERY_STRING']))
		   {
			   //不存在QUERY_STRING时
			$this->url = $_SERVER['REQUEST_URI']."?".$this->page_name."=";
		   }
		   else
		   {
				if(stristr($_SERVER['QUERY_STRING'],$this->page_name.'='))
				{
						//地址存在页面参数
					  $this->url = str_replace($this->page_name.'='.$this->nowindex,'',$_SERVER['REQUEST_URI']);
					  $last = $this->url[strlen($this->url)-1];
					  if( $last=='?' || $last=='&' )
					  {
						  $this->url .= $this->page_name."=";
					  
					  } 
					  else
					  {
							 $this->url .= '&'.$this->page_name."=";
					  }
				}
				else
				{
					//
				  $this->url = $_SERVER['REQUEST_URI'].'&'.$this->page_name.'=';
				}//end if    
		   }//end if
	  }//end if
 }
 
 /**
  * 设置当前页面
  * @param Int $nowindex  当前页号
  */
 function setNowIndex($nowindex)
 {
	  if(empty($nowindex)){
	   //系统获取
	   if(isset($_GET[$this->page_name])){
		$this->nowindex = intval($_GET[$this->page_name]);
	   }
	  }else{
		  //手动设置
	   $this->nowindex = intval($nowindex);
	  }
 }
  
 /**
  * 为指定的页面返回地址值
  *
  * @param int $pageno 页号
  * @return string $url 转向URL
  */
 function getUrl($pageno=1)
 {
 	 return $this->url.$pageno;
 }
 
 /**
  * 获取分页显示文字，比如说默认情况下getText('<a href="">1</a>')将返回[<a href="">1</a>]
  * 即将分页符加上左边界和右边界
  * @param String $str  页表示符
  * @return string $url  
  */ 
 function getText($str)
 {
 	 return $this->format_left.$str.$this->format_right;
 }
 
 /**
   * 获取链接地址
   * @param String $text     链接文本
   * @param String $url      转向地址
   * @param String $style    样式   
 */
 function getLink($url,$text,$style=''){
  	$style=(empty($style))?'':'class="'.$style.'"';
 	 if($this->is_ajax){
      //如果是使用AJAX模式
   		return '<a '.$style.' href="javascript:'.$this->ajax_action_name.'(\''.$url.'\')">'.$text.'</a>';
  	 }else{
   		return '<a '.$style.' href="'.$url.'">'.$text.'</a>';
	 }
 }
 /**
   * 出错处理方式
   * @param String $function  	  出错函数
   * @param String $errormsg      出错信息
 */
 function error($function,$errormsg)
 {
     die('Error in file <b>'.__FILE__.'</b> ,Function <b>'.$function.'()</b> :'.$errormsg);
 }
}
?>